package com.neusoft.elm.framework;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.Method;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

@WebServlet("/")
/*
@WebServlet("/")的含义是将DispatcherServlet类映射到根路径("/")，也就是说当客户端发起请求时，
如果请求的URL匹配根路径，就会由DispatcherServlet处理该请求。
在这段代码中，DispatcherServlet继承自HttpServlet，因此它是一个Servlet类，
通过@WebServlet("/")注解将其映射到根路径，使得所有以根路径为URL的请求都会交由DispatcherServlet处理。
 */
public class 	DispatcherServlet extends HttpServlet{

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//中文编码处理
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");
		//获取客户端请求路径
		String path = request.getServletPath();//获取客户端请求的路径，然后根据约定进行解析

		//约定大于配置！ 我来解析你的请求！
		//根据请求路径，讲控制器类名和其中方法名解析出来
		String className = path.substring(1,path.lastIndexOf("/"));
		String methodName = path.substring(path.lastIndexOf("/")+1);//截取到最后
		PrintWriter out = null;
		try {
			//获取controller类的信息，然后通过描述类获取对象
			Class clazz = Class.forName("com.neusoft.elm.controller."+className);
			Object controller = clazz.getDeclaredConstructor().newInstance();
			//创建控制器类的对象。这里使用了反射的 getDeclaredConstructor() 方法获取无参构造函数，并通过 newInstance() 方法创建实例。
			Method method = clazz.getMethod(methodName,new Class[] {HttpServletRequest.class});
			//方法获取指定方法名和参数类型的方法对象。这里 methodName 是一个字符串变量，
			// 表示控制器类中的方法名，并且该方法接受一个 HttpServletRequest 类型的参数。
			Object result = method.invoke(controller,new Object[] {request});
			//method.invoke()方法调用该方法，传入request对象作为参数
			out = response.getWriter();//法获取 PrintWriter 对象 out，用于输出结果。
			ObjectMapper om = new ObjectMapper();//创建 ObjectMapper 对象 om，用于将对象序列化为 JSON 字符串。
			out.print(om.writeValueAsString(result));
			//调用方法后，将返回的结果使用ObjectMapper类将其转换为JSON格式的字符串，并通过PrintWriter对象将其写入响应中，返回给客户端。
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			System.out.println("DispatcherServlet信息：Servlet请求路径："+path);
			System.out.println("DispatcherServlet信息：类名："+className+"\t方法名："+methodName);
		} finally {
			out.close();
		}
		
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		doPost(request, response);
	}
	
}
